class Observer {
  constructor(data) {
    // 将用户自定义的data中的元素进行响应化
    this.defineReactive(data)
  }
  defineReactive(data) {
    Object.keys(data).forEach(key => {
      var val = data[key]
      // 用来收集依赖
      var dep = new Dep()
      if (typeof val === 'object') {
        // 递归
        new Observer(val)
      }
      Object.defineProperty(data, key, {
        get() {
          if (Watcher) {
            // 添加依赖
            dep.addSub(Watcher)
          }
          return val
        },
        set(newVal) {
          if (newVal === val) {
            return
          }
          val = newVal
          // 通知更新
          dep.notify()
        }
      })
    })
  }
}